package com.tedu.web.controller;

import com.github.pagehelper.PageHelper;
import com.tedu.pojo.NoticePojo;
import com.tedu.service.NoticeService;
import com.tedu.web.pojo.JesonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 此对象为公告模块控制层处理器对象
 * 1.请求url设计
 * 1）条件查询(请求方式"GET",请求url“/notice/”）
 * */
//@ResponseBody
//@Controller
@RestController
@RequestMapping("/notice/")
public class NoticeController {
    @Autowired
    private NoticeService noticeService;
    @DeleteMapping("{id}")
    public JesonResult dodeleteNotice(@PathVariable Long...id){
        noticeService.deleteNotice(id);
        return new JesonResult("delete ok");
    }
    @PutMapping
    public JesonResult doupdateNotice(NoticePojo noticePojo){
        noticeService.updateNotice(noticePojo);
        return new JesonResult("update OK");
    }
    /**
     * 保持请求资源的唯一性
     * rest风格的url中允许使用变量，但是这个变量要使用{}括起来
     * 当我们在方法参数中需要这个变量的值时，可以使用@PathVariable对方法参数进行描述
     * 当变量名不一致时，@GetMapping"{aid}"和(@PathVariable("aid") Long id)可以从命名
     * http://localhost/notice/1
     * */
    @GetMapping("{id}")
    public JesonResult dofindById(@PathVariable Long id){
//        try{
       return new JesonResult(noticeService.findId(id));
//        }catch (Exception e){
//            return new JesonResult(e);
//        }
    }
    @PostMapping
    /**@RequestBody对参数进行描述
     * 客服端可以向服务端传递json的字符串参数
     * 服务端拿到数据以后，会将json字符串转为参数类型的对象
     * 反序列化，把json转为对象
     * 一个controller方法中只能由一个参数使用@RequestBody
     * */
    public  JesonResult dosaveNotice(@RequestBody NoticePojo noticePojo){
        noticeService.saveNotice(noticePojo);
        /**json序列化，把对象转为json字符串*/
        return new JesonResult("save ok");
    }
    /**
     * 请求url：http://locahost:8080/notice/
     * 因为修改了端口80，所以可以不写端口号http://locahost/notice/
     */
    @GetMapping
    public JesonResult doFindNotice(NoticePojo noticePojo){
        //启动分页查询拦截
       return new JesonResult(PageHelper.startPage(1, 3)
                /**
                 * 执行查询
                 * 在拉姆达表达是当中，你的接口中只有一种方法：【如：ISelect()只有一种方法
                 *  void doSelect();】，可以把方法省略掉
                 *  .doSelectPageInfo(new ISelect() {
                 *      @Override
                 *      public void doSelect() {
                 *         noticeService.findNotice(noticePojo);
                 *         }
                 *           });
                 * */
                .doSelectPageInfo(()->
                        noticeService.findNotice(noticePojo)
                ));
        //return new JesonResult(pageInfo);
        //return new JesonResult(noticeService.findNotice(noticePojo));
    }
    /**局部异常处理方法，只能处理当前controller类的runtimeException异常*/
//    @ExceptionHandler(RuntimeException.class)
//    public JesonResult doHandleRuntimeException(RuntimeException e){
//        e.printStackTrace();
//        return new JesonResult(e);
//   }
}

